/**
 * Electron主进程入口
 * 负责创建浏览器窗口和处理应用生命周期事件
 * 实现Electron应用的核心功能和IPC通信初始化
 * 
 * 该文件是整个Electron应用程序的入口点，负责：
 * 1. 应用程序窗口的创建和配置
 * 2. 应用生命周期事件的处理
 * 3. IPC通信机制的初始化
 * 4. 安全配置和性能优化
 */
import { app, BrowserWindow, screen } from 'electron';
import * as path from 'path';
import * as url from 'url';
import { IpcRouter } from './ipcRouter';

/**
 * 主窗口实例引用
 * 保持全局引用以防止JavaScript对象被垃圾回收时自动关闭窗口
 * 当窗口关闭时，该引用会被设置为null
 */
let mainWindow: BrowserWindow | null = null;

/**
 * 创建主应用窗口
 * 配置窗口属性、安全选项和预加载脚本
 * 实现应用界面的初始化
 * 
 * 窗口配置包括：
 * - 尺寸设置（宽度、高度、最小宽度、最小高度）
 * - 安全选项（禁用nodeIntegration、启用上下文隔离等）
 * - 性能优化（禁用后台节流、启用沙盒模式等）
 */
function createWindow() {
  // 获取主屏幕尺寸
  const mainScreen = screen.getPrimaryDisplay();
  const dimensions = mainScreen.size;
  // 计算并限制默认窗口尺寸（防止在超大或超小屏幕上显示异常）
  const defaultWidth = Math.min(1200, Math.round(dimensions.width * 0.9));
  const defaultHeight = Math.min(800, Math.round(dimensions.height * 0.8));

  // 创建浏览器窗口实例，设置合理的默认和最小尺寸
  mainWindow = new BrowserWindow({
    width: defaultWidth,
    height: defaultHeight,
    minWidth: 800,
    minHeight: 600,
    show: false, // 先隐藏窗口，待 ready-to-show 后再显示以避免闪烁
    webPreferences: {
      nodeIntegration: false, // 禁用节点集成以增强安全性
      contextIsolation: true, // 启用上下文隔离以增强安全性
      preload: path.join(__dirname, 'preload.js'), // 指定预加载脚本
      webviewTag: false, // 禁用webview标签以增强安全性
      allowRunningInsecureContent: false, // 禁止在https页面中运行http内容
      sandbox: true, // 启用沙盒模式
      disableBlinkFeatures: 'Auxclick', // 禁用一些可能有安全风险的Blink特性
      backgroundThrottling: false // 防止窗口在后台时性能降低
    },
    autoHideMenuBar: true // 自动隐藏菜单栏
  });

  // 在准备好显示时再展示窗口，提升用户体验
  mainWindow.once('ready-to-show', () => {
    if (mainWindow) mainWindow.show();
  });

  // 加载应用的index.html
  const startUrl = process.env.ELECTRON_START_URL || url.format({
    pathname: path.join(__dirname, 'index.html'),
    protocol: 'file:',
    slashes: true
  });

  // 加载URL
  mainWindow.loadURL(startUrl);

  // 在开发模式下打开DevTools
  if (process.env.NODE_ENV === 'development' || process.env.ELECTRON_START_URL) {
    // 打开DevTools作为独立窗口
    mainWindow.webContents.openDevTools({ mode: 'detach' });
  }

  // 窗口关闭时释放窗口对象引用
  mainWindow.on('closed', () => {
    mainWindow = null;
  });
}

/**
 * 应用就绪事件处理
 * 当Electron完成初始化并准备创建浏览器窗口时触发
 * 执行窗口创建和IPC路由初始化
 * 
 * 该事件是应用程序启动的核心事件，在此事件中：
 * 1. 创建主窗口
 * 2. 初始化IPC通信路由
 * 3. 执行其他必要的初始化操作
 */
app.on('ready', async () => {
  // 创建主窗口
  createWindow();
  
  // 初始化IPC路由（必须在窗口创建后进行）
  IpcRouter.init();
});

/**
 * 所有窗口关闭事件处理
 * 实现跨平台的窗口关闭行为
 * 
 * 在Windows和Linux上，当所有窗口关闭时通常退出应用
 * 在macOS上，应用通常保持运行状态，用户可以通过dock图标重新打开窗口
 */
app.on('window-all-closed', () => {
  // 在macOS上，应用程序和它们的菜单栏通常保持活动状态，直到用户使用Cmd + Q明确退出
  if (process.platform !== 'darwin') {
    app.quit();
  }
});

/**
 * 应用激活事件处理
 * 实现macOS平台下的dock图标点击行为
 * 
 * 当用户点击dock图标且没有其他窗口打开时重新创建窗口
 * 这是macOS应用的标准行为
 */
app.on('activate', () => {
  // 在macOS上，点击dock图标且没有其他窗口打开时重新创建窗口
  if (mainWindow === null) {
    createWindow();
  }
});

/**
 * 应用主进程扩展点
 * 可以在此添加特定于应用程序的主进程代码或导入其他模块
 * 
 * 例如：
 * - 注册自定义协议
 * - 处理系统级事件
 * - 初始化全局状态
 * - 配置日志系统
 */